#include <stdio.h>

int main(int argc, const char *argv[])
{
	int s[3][4] = {1,2,3,4,
					5,6,7,8,
					9,10,11,12};
	// 二维数组的数组名也是首地址
	// 操作空间是一整行元素(行指针)
	printf("s = %p\n", s);  // 相差16字节  4个int  一行元素的大小
	printf("s+1 = %p\n", s+1);

	// 对二维数组的数组名取一次 * 操作 表示降维
	// 把操作空间是一整行元素的指针 降维 成操作空间是一个元素的指针(列指针)
	printf("*s = %p\n", *s);  // 相差4字节 1个int  一个元素的大小
	printf("*s+1 = %p\n", *s+1);

	// 对列指针再取 * 操作 才表示操作具体的元素
	printf("**s = %d\n", **s); // 1
	printf("*(*s+2) = %d\n", *(*s+2)); // 3
	printf("*(*(s+1)+2) = %d\n", *(*(s+1)+2)); // 7

	// 也就是说 对于二维数组而言
	// s[i][j]  <==>  *(*(s+i)+j)  <==>  *(s[i]+j)
	
	// 遍历二维数组
	int i = 0;
	int j = 0;
	for(i = 0; i < 3; i++){
		for(j = 0; j < 4; j++){
			// printf("%d ", s[i][j]);
			// printf("%d ", *(s[i]+j));
			printf("%d ", *(*(s+i)+j));
		}
		printf("\n");
	}

	printf("----------------------------\n");

	// 注意：不要使用普通的指针来保存二维数组的首地址
	// 因为二维数组的首地址操作空间是一行元素 而普通的指针操作空间是一个元素
	// 普通的指针没法按 行 列 的方式访问二维数组的元素
	int *p = s;
	for(i = 0; i < 3*4; i++){
		printf("%d ", p[i]);
		if((i+1)%4 == 0){
			printf("\n");
		}
	}

	return 0;
}
